﻿using System;
using System.Windows.Forms;
using CloudShot.Core.Interfaces;
using CloudShot.Core.Utils;

namespace DropboxImageStorage
{
	public partial class DropboxStorageSettingsControl : UserControl, ISettingsUIHolder
	{
		private readonly DropboxStorage _storage;

		public DropboxStorageSettingsControl(DropboxStorage storage)
		{
			_storage = storage;

			InitializeComponent();
		}

		public IImageStorage Storage { get { return _storage; } }

		public Control Control { get { return this; } }

		public void LoadSettings()
		{
			cboImageFormat.Items.Clear();

			foreach (string extension in _storage.SupportedFormats.GetImageExtensions())
			{
				cboImageFormat.Items.Add(extension);
			}

			cboImageFormat.SelectedItem = _storage.CurrentImageFormat.GetImageExtension();
			chkShortUrl.Checked = _storage.ShortenUrls;
			oAuthControl.SetState(_storage.IsAuthorized ? AuthState.Authorized : AuthState.NotAuthorized);
		}

		public void SaveSettings()
		{
			_storage.CurrentImageFormat = ImageTypeUtils.GetImageType((string)cboImageFormat.SelectedItem);
			_storage.ShortenUrls = chkShortUrl.Checked;
		}

		public void ClearUnsavedSettings()
		{
			//cancel wait to authorization
			if (oAuthControl.AuthState == AuthState.WaitAuthorization)
				Unlink();
		}

		private async void SignIn()
		{
			oAuthControl.SetState(AuthState.WaitAuthorization);

			bool success = await _storage.SignIn();

			oAuthControl.SetState(success ? AuthState.Authorized : AuthState.NotAuthorized);
		}

		private void Unlink()
		{
			_storage.SignOut();
			oAuthControl.SetState(AuthState.NotAuthorized);
		}

		public bool ValidateSettings()
		{
			if (cboImageFormat.SelectedItem == null)
			{
				//TODO может лучше возвращать список ошибок текстом и показывать MsgBox из SettingsForm, чтобы это для всех плагинов было однообразно?
				MessageBox.Show("Not set image format.\nPlease select image format.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
				
				//TODO не будет работать, т.к. текущий сторадж может быть еще не активен, в случае если текущий сторадж активен - фокус выставляется нормально
				cboImageFormat.Focus();
				
				return false;
			}

			return true;
		}

		#region Event Handlers

		private void OnSignInClick(object sender, EventArgs e)
		{
			SignIn();
		}

		private void OnUnlinkClick(object sender, EventArgs e)
		{
			Unlink();
		}

		private void OnCancelWaitingClick(object sender, EventArgs e)
		{
			Unlink();
		}

		#endregion
	}
}